<?php 

// +----------------------------  订单相关控制器 ------------------------------------------

namespace app\controller;

use app\BaseController;
use app\dto\OrderVo;
use app\dto\R;
use app\model\Orders;
use app\model\OrderSpecifications;
use think\facade\Request;
use think\facade\Validate;

class OrderController extends BaseController{

    // 根据订单ID获取订单信息
    public function getOrderById($orderId)
    {
        // 参数验证
        if (empty($orderId)) {
            return json(R::error("订单ID为空"));
        }

        // 查询订单信息：关联查询优惠券信息
        $orderInfo = Orders::with(['coupon'])
            ->where('order_id', $orderId)
            ->find();
            
        if (!$orderInfo) {
            return json(R::error("没有找到订单"));
        } else {
            return json(R::result(1, "获取成功", $orderInfo));
        }
        
    }

     /**
     * 根据用户ID获取所有订单及对应商品信息和规格信息
     * 
     * @param string $userId 用户ID
     * @return \think\response\Json
     */
    public function getOrdersByUserId($userId)
    {
        // 参数验证
        if (empty($userId)) {
            return json(R::error("用户ID为空")); 
        }
        
        try {
            // 使用with方法同时加载订单的商品信息和规格信息
            $orders = Orders::with([
                'goods' => function($query) {
                    // 嵌套关联查询
                    $query->with(['slideshows', 'detailImgs']);
                },
                'orderSpecifications',
                'address' => function($query) {
                    // 指定要查询的地址字段
                    // $query->;
                }
            ])
            ->where('user_id', $userId)
            ->order('create_time', 'desc')
            ->select();
            
            // 返回成功响应
            return json(R::result(1, "获取订单数据成功", $orders));
            
        } catch (\Exception $e) {
            // 异常处理
            return json(R::error("获取订单数据失败: " . $e->getMessage()));
        }
    }

    // 为订单添加规格信息 OrderSpecifications
    public function addOrderSpecifications($orderId)
    {
        // 获取规格对象
        $specification = request()->post();
        
        // 创建订单规格对象
        $orderSpecifications = new OrderSpecifications($specification);
        $orderSpecifications->order_id = $orderId;
        
        // 新增订单规格到数据库
        $result = $orderSpecifications->save();

        if (!$result) {
            return json(R::error("订单规格添加失败"));
        }
        
        return json(R::result(1, "订单规格添加成功", null));
    }


    // 根据订单号获取订单状态
    public function getOrderStatus($orderId)
    {
        // 参数验证
        if (empty($orderId)) {
            return json(R::error("订单ID为空"));
        }
        
        // 查询订单状态
        $order = Orders::where('order_id', $orderId)->find();
        
        if (!$order) {
            return json(R::error("没有找到订单"));
        } else {
            return json(R::result(1, "获取成功", $order->order_status));
        }
    }

    // 创建订单
    public function createOrder()
    {
        // 接收参数：用户ID，商品ID，数量，地址ID
        $data = request()->post();
        
        // 使用参数创建订单对象
        $order = new Orders($data);
        // 填充参数：订单ID，创建时间，订单状态（0:待付款，1：待发货，2：待收货，3：售后，4：完成, 5:已取消）
        $order->order_id = uniqid(); // 生成唯一订单ID
        $order->create_time = date('Y-m-d H:i:s'); // 当前时间
        $order->order_status = 0; // 默认状态为待付款

        // 新增订单到数据库
        $result = $order->save();

        if (!$result) {
            return json(R::error("订单创建失败"));
        }
        
        $returnObj = new OrderVo($order->order_id, "【Uni商城购物】", $order->real_price);

        return json(R::result(1, "订单创建成功", $returnObj));
    }

    /**
     * 获取订单徽标状态
     * 统计用户各个订单状态的数量
     * @param string $userId 用户ID
     * @return \think\Response
     */
    public function getOrderStatusIcon($userId)
    {
        // 参数验证
        if (empty($userId)) {
            return json(R::error("用户ID为空"));
        }
        
        try {
            // 查询该用户的所有订单
            $orders = Orders::where('user_id', $userId)->select();
            
            // 完全按照原MongoDB实现的逻辑手动统计
            $statusCountMap = [];
            foreach ($orders as $order) {
                $status = (int)$order->order_status;
                if (isset($statusCountMap[$status])) {
                    $statusCountMap[$status]++;
                } else {
                    $statusCountMap[$status] = 1;
                }
            }
            
            // 转换成Long类型以匹配原有MongoDB实现
            foreach ($statusCountMap as $status => $count) {
                $statusCountMap[$status] = (int)$count; 
            }
            
            // 使用自定义Response类返回，确保数据结构正确
            return json(R::result(1, "获取订单状态统计成功", (object)$statusCountMap));
        } catch (\Exception $e) {
            return json(R::error("获取订单状态统计失败：" . $e->getMessage()));
        }
    }


    // ======== 管理端 ===========
    /**
     * 获取订单列表（分页查询）
     * 
     * @return Json
     */
    public function getOrderList()
    {
        // 获取请求参数
        $page = (int)Request::param('page', 1);
        $size = (int)Request::param('size', 10);
        $userId = Request::param('user_id', '');
        
        // 构建查询条件
        $where = [];
        if (!empty($userId)) {
            $where[] = ['user_id', '=', $userId];
        }
        
        // 查询订单数据，使用关联查询
        $orders = Orders::with(['goods', 'user' => function($query) {
                $query->field('user_id,user_name');
            }])
            ->where($where)
            ->order('create_time', 'desc')
            ->page($page, $size)
            ->select();
        
        // 获取总记录数
        $total = Orders::where($where)->count();
        
        // 整理数据，按照前端需要的格式返回
        $list = [];
        foreach ($orders as $order) {
            $list[] = [
                'id' => $order->id,
                'order_id' => $order->order_id,
                'user_id' => $order->user_id,
                'user_name' => $order->user ? $order->user->user_name : '',
                'goods_id' => $order->goods_id,
                'goods_name' => $order->goods ? $order->goods->goods_name : '',
                'create_time' => $order->create_time,
                'order_status' => $order->order_status,
                'order_status_text' => $order->getOrderStatusTextAttr(null, $order->toArray()),
                'should_price' => $order->should_price,
                'real_price' => $order->real_price,
                'use_coupon' => $order->use_coupon,
                'coupon_id' => $order->coupon_id,
                'logistics_number' => $order->logistics_number,
                'number' => $order->number
            ];
        }
        
        // 返回数据
        return json([
            'code' => 200,
            'message' => '获取订单列表成功',
            'data' => [
                'list' => $list,
                'total' => $total,
                'page' => $page,
                'size' => $size
            ]
        ]);
    }
    
    /**
     * 修改订单状态
     * 
     * @return Json
     */
    public function updateOrderStatus()
    {
        // 获取请求参数
        $param = Request::param();
        
        // 验证参数
        $validate = Validate::rule([
            'order_id' => 'require',
            'order_status' => 'require|number|between:0,5',
        ]);
        
        if (!$validate->check($param)) {
            return json(['code' => 400, 'message' => $validate->getError()]);
        }
        
        // 查询订单是否存在
        $order = Orders::where('order_id', $param['order_id'])->find();
        if (!$order) {
            return json(['code' => 404, 'message' => '订单不存在']);
        }
        
        // 处理订单状态从待发货改为待收货的情况，需要物流单号
        if ($order->order_status == 1 && $param['order_status'] == 2) {
            if (empty($param['logistics_number'])) {
                return json(['code' => 400, 'message' => '将订单改为待收货状态需要提供物流单号']);
            }
            $order->logistics_number = $param['logistics_number'];
        }
        
        // 更新订单状态
        $order->order_status = $param['order_status'];
        $result = $order->save();
        
        if ($result) {
            return json(['code' => 200, 'message' => '订单状态更新成功']);
        } else {
            return json(['code' => 500, 'message' => '订单状态更新失败']);
        }
    }

}